//
//  dlist_node.c
//  pr_fun1
//
//  Created by chenyh on 2021/1/25.
//

#include "dlist_node.h"



int dlist_init(dlist_head_t *p_head)
{
    if (p_head == NULL) {
        return -1;
    }
    p_head->p_next = p_head;
    p_head->p_prev = p_head;
    return 0;
}

///寻找某一结点的前一结点-》指向前驱的指针
dlist_node_t *dlist_prev_get(dlist_head_t *p_head,dlist_node_t * p_pos) {
    if (p_pos != NULL ) {
        return p_pos->p_prev;
    }
    return NULL;
    
}
///寻找某一结点的后一结点 -》指向后继的指针
dlist_node_t *dlist_next_get(dlist_head_t *p_head,dlist_node_t * p_pos) {
    if (p_pos != NULL ) {
        return p_pos->p_next;
    }
    return NULL;
}
///获取尾结点
dlist_node_t *dlist_tail_get(dlist_head_t *p_head) {
    if (p_head != NULL) {
        return p_head->p_prev;
    }
    return NULL;
}
///获取开始位置，第一个用户结点
dlist_node_t *dlist_begin_get(dlist_head_t * p_head) {
    if (p_head != NULL) {
        return p_head->p_next;
    }
    return NULL;
}
///获取结束位置，尾结点下一个结点的位置
dlist_node_t *dlist_end_get(dlist_head_t * p_head) {
    if (p_head != NULL) {
        return p_head->p_prev;
    }
    return NULL;
}
int dlist_add_tail(dlist_head_t * p_head,dlist_node_t *p_node) {
    if (p_head == NULL) {
        printf("链表为空，请先初始化!");
        return -1;
    }
    return dlist_add(p_head, p_head->p_prev, p_node);
}
///p_head为指向链表头结点的指针，p_pos指定了添加的位置,新结点既添加在该指针指向的节点之后.
///p_node为指向待添加结点的指针。
int dlist_add(dlist_head_t * p_head,dlist_node_t *p_pos,dlist_node_t *p_node) {
    if ((p_head == NULL) || (p_pos == NULL) || (p_node == NULL)) {
        return -1;
    }
    /**
     @1 新结点的p_prev指向前结点
     @2 新结点的p_next指向后结点；
     @3 前结点的p_next由指向后结点变为指向新结点;
     @4 后结点的p_prev由指向前结点修改为指向新结点
     */
    p_node->p_prev = p_pos;         // @1
    p_node->p_next = p_pos->p_next; // @2
    p_pos->p_next->p_prev = p_node; // @4
    p_pos->p_next = p_node;         // @3
    return 0;
}

int dlist_del(dlist_head_t * p_head,dlist_node_t *p_node) {
    if ((p_head == NULL) || (p_node == NULL) ||( p_head == p_node)) {
        return -1;
    }
    p_node->p_prev->p_next = p_node->p_next; //前结点的p_next修改未指向后结点
    p_node->p_next->p_prev = p_node->p_prev; //后结点的p_prev修改为指向前结点
    p_node->p_next = NULL;
    p_node->p_prev = NULL;
    return 0;
}

int dlist_foreach(dlist_head_t         *p_head,
                  dlist_node_process_t pfn_node_process,
                  void                 *p_arg)
{
    dlist_node_t *p_tmp,*p_end;
    int          ret;
    if ((p_head == NULL) || (pfn_node_process == NULL)) {
        return -1;
    }
    p_tmp = dlist_begin_get(p_head);
    p_end = dlist_end_get(p_head);
    while (p_tmp != p_end) {
        ret = pfn_node_process(p_arg,p_tmp);
        if (ret < 0) {
            return ret;
        }
        p_tmp = dlist_next_get(p_head, p_tmp); //继续下一个节点
    }
    return 0;
}


void dlist_iterator_if_get(iterator_if_t *p_if){
    /*去掉static则iterator_if就变成一个局部变量。在函数执行完后失效，因此返回它的地址毫无意义
    调用形式变为: iterator_if_t iterator_if;
     dlist_iterator_if_get(&iterator_if);
     dlist_iterator_if_get(iterator_if_t *p_if);
     */
    iterator_if_init(p_if, p_if->pfn_next, p_if->pfn_prev);
}



